package br.com.guarana.business.service;

import br.com.guarana.business.model.Cidade;
import br.com.guarana.business.model.ResultadoGenerico;
import br.com.guarana.business.model.Segurado;
import br.com.guarana.util.Util;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Vector;
import javax.persistence.Query;

/**
 *
 * @author 
 */
public class ConsultaService extends PadraoService {        
        
    
    public List<ResultadoGenerico> consultaAniversariantes(Integer mes) {
        //busca SQL
        StringBuilder sFrase = new StringBuilder(    	     
            "SELECT" +                
            "  c.nome," +
            "  c.data_nascimento," +                                               
            "  c.endereco_residencial," +            
            "  c.numero_residencial," +
            "  c.bairro_residencial," +
            "  c.complemento_residencial," +
            "  c.cep_residencial," +
            "  c.cidade_id_residencial," +
            "  c.ddd_telefone_residencial," +
            "  c.telefone_residencial," +
            "  c.ddd_celular_residencial," +
            "  c.celular_residencial" +                                
            " FROM" +
            "  segurado c" +            
            " WHERE  " +
            "  EXTRACT(MONTH FROM c.data_nascimento) = " + mes +            
            " ORDER BY" +
            "  extract(DAY FROM c.data_nascimento) ASC");                

        //query
        Query query = this.getDAO().getEntityManager().createNativeQuery(sFrase.toString());
        List listaSQL = query.getResultList();

        //lista pra gurdar resultados
        List<ResultadoGenerico> listaResultado = new ArrayList<ResultadoGenerico>();
        CidadeService cidadeService = new CidadeService();

        //pego a lista SQL e monto o resultado
        for (int i = 0; i < listaSQL.size(); i++) {

            Vector obj = (Vector) listaSQL.get(i);
            
            ResultadoGenerico g = new ResultadoGenerico();
            
            //nome segurado
            g.setCampoString1((String) obj.get(0));
            
            //data aniversario
            g.setCampoDate1((Date) obj.get(1));                                   
            
            //formata o telefone
            if (obj.get(8) != null && obj.get(9) != null){
                String telefoneFormatado = Util.completaComEspacoEsquerda(String.valueOf(obj.get(9)), 9);
                g.setCampoString2("(" + obj.get(8) + ") " +
                    telefoneFormatado.substring(0, 5) + "-" +
                    telefoneFormatado.substring(5, 9) + " ");
            }
            
            //formata o celular
            if (obj.get(10) != null && obj.get(11) != null){
                String telefoneFormatado = Util.completaComEspacoEsquerda(String.valueOf(obj.get(11)), 9);
                g.setCampoString3("(" + obj.get(10) + ") " +
                    telefoneFormatado.substring(0, 5) + "-" +
                    telefoneFormatado.substring(5, 9) + " ");
            }
            
            //formata o endereço
            StringBuilder enderecoCompletoResidencial = new StringBuilder();
            if (obj.get(2) != null){
                enderecoCompletoResidencial.append((String) obj.get(2));
            }
            if (obj.get(3) != null){
                enderecoCompletoResidencial.append(", " + (String) obj.get(3));
            }
            if (obj.get(5) != null){
                enderecoCompletoResidencial.append(" " + (String) obj.get(5));
            }
            if (obj.get(4) != null){
                enderecoCompletoResidencial.append(" " + (String) obj.get(4));
            }
            if (obj.get(7) != null){
                Cidade cidade = cidadeService.buscaCidadePorId((Integer) obj.get(7));
                if (cidade != null){
                    enderecoCompletoResidencial.append(" - " + cidade.getCidade() + "\\" + cidade.getEstado());
                }                
            }
            g.setCampoString4(enderecoCompletoResidencial.toString());
                    
            listaResultado.add(g);
        }
        
        return listaResultado;
    }

    //Pagamentos Atrasados~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    public List<ResultadoGenerico> consultaApolicesVencidas(Date dataBase, Segurado segurado) {                        
        StringBuilder sFiltro = new StringBuilder();
        DateFormat formataData = new SimpleDateFormat("yyyy-MM-dd");        
        
        if (segurado != null) {
            sFiltro.append(" AND a.segurado_id = " + segurado.getId());
        }
        
        StringBuilder sFrase = new StringBuilder(
            "SELECT" +
            "  s.id," +   
            "  s.nome," +     
            "  sa.numero_apolice," +    
            "  sa.data_apolice" +            
            " FROM" +
            "  segurado s," +
            "  segurado_apolice sa" +            
            " WHERE " +
            "  sa.segurado_id = a.id AND" +            
            "  sa.data_apolice < '" + formataData.format(dataBase) + "'" +                
            sFiltro.toString() +
            " ORDER BY " +
            "  s.nome ASC");

        //query
        Query query = this.getDAO().getEntityManager().createNativeQuery(sFrase.toString());
        List listaSQL = query.getResultList();

        //lista pra gurdar resultados
        List<ResultadoGenerico> listaResultado = new ArrayList<ResultadoGenerico>();

        //pego a lista SQL e monto o resultado
        for (int i = 0; i < listaSQL.size(); i++) {

            Vector obj = (Vector) listaSQL.get(i);
            
            ResultadoGenerico g = new ResultadoGenerico();
            
            //segurado
            g.setCampoString1((String) obj.get(0));
            
            //id do atendimento para detalhes
            g.setCampoInteger1((Integer) obj.get(1));
            
            //data atendimento
            g.setCampoDate1((Date) obj.get(2));
            
            //numero parcela
            g.setCampoInteger2((Integer) obj.get(3));
            
            //data vencimento parcela
            g.setCampoDate2((Date) obj.get(4));
            
            //valor parcela
            g.setCampoDouble1(((BigDecimal) obj.get(6)).doubleValue());
                        
            listaResultado.add(g);
        }
        
        return listaResultado;
    }
    
    
    //TESTES - TESTES - TESTES - TESTES - TESTES - TESTES - TESTES - TESTES
    public static void main(String[] args) {
        ConsultaService ta = new ConsultaService();
        
        List<ResultadoGenerico> segurados = ta.consultaAniversariantes(5);
        for (ResultadoGenerico resultadoGenerico : segurados) {                    
            System.out.println(resultadoGenerico.getCampoString1() + 
                    " -- " +  resultadoGenerico.getCampoDate1() +
                    " -- " +  resultadoGenerico.getCampoString2()+
                    " -- " +  resultadoGenerico.getCampoString3() +
                    " -- " +  resultadoGenerico.getCampoString4()
                    );
        }
        
//        Segurado segurado = new SeguradoService().findSegurado(1);
//        
//        //pagamentos atrasados        
//        List<ResultadoGenerico> lista0 = ta.consultaPagamentosAtrasados(new Date(), segurado);
//        for (ResultadoGenerico resultadoGenerico : lista0) {
//            System.out.println(resultadoGenerico.getCampoString1() + " -- " + resultadoGenerico.getCampoInteger2() + " --- " + resultadoGenerico.getCampoDouble1());
//        }
        
        

    }   
    
}

